package main

import (
	"fmt"
	"reflect"
)

// StructToMap 将结构体转换为 map
func StructToMap(input interface{}) (map[string]interface{}, error) {
	// 确保传入的是结构体类型
	val := reflect.ValueOf(input)
	if val.Kind() != reflect.Struct {
		return nil, fmt.Errorf("expected a struct, but got %v", val.Kind())
	}

	// 创建一个 map 用于存储字段名和字段值
	result := make(map[string]interface{})

	// 获取结构体的字段数量
	for i := 0; i < val.NumField(); i++ {
		// 获取字段的名称和字段的值
		field := val.Field(i)
		fieldName := val.Type().Field(i).Name

		// 将字段名称和值加入 map 中
		result[fieldName] = field.Interface()
	}

	return result, nil
}

type Person struct {
	Name    string
	Age     int
	Address string
}

func main() {
	// 创建一个结构体实例
	p := Person{Name: "John", Age: 30, Address: "New York"}

	// 将结构体转换为 map
	result, err := StructToMap(p)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	// 输出结果
	fmt.Println("Converted Map:", result)
}
